<!--
 * @Description:
 * @version:
 * @Author: 尹鹏孝
 * @Date: 2023-03-25 11:44:26
 * @LastEditors: 尹鹏孝
 * @LastEditTime: 2023-03-30 08:42:42
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型链，6种继承，多态</title>
</head>
<body>
    在javascript里，每个自定义函数都有一个prototype用于存放属性和方法，函数都的prototype都指向上一级的对象,
    __proto__是Object.prototype;而Object.prototype的__proto__ 的尽头是null;
    在javascript对象中，使用function的prototype来查找对象属性，如果当前对象的原型prototype里存在所访问的属性就，不再继续查找，否则会继续上一级查找直到Object.prototype。为null的时候结束查找，把这种查找一个属性存在的动作形成的彼此关联的全过程称为原型链，而连接链条的prototype称为原型。
    在javascript中每个对象都存在__proto__这是一个对象的内置属性。它指向他的构造函数prototype指向的对象。即任何对象都是由一个构造函数创建的，但是不是每一个对象都有 prototype，只有方法才有 prototype。
    普通对象有__proto__，函数实例对象有__proto__和prototype

    <button onclick="myObject.getName()">发送短信</button>
    <script>
    'use static'
    function fn(){

    }
    console.log(typeof fn.__proto__);
    console.log(typeof fn.prototype);

    const obj={};
    console.log(typeof obj.__proto__);
    console.log(typeof obj.prototype);
    // 实例的__proto__指向prototype
    // __proto__指向构造函数的prototype;
    console.log(fn.__proto__ === Function.prototype)
    console.log(obj.__proto__ === Object.prototype)

    console.log(fn.prototype.__proto__ === Object.prototype)
    console.log(Function.prototype.__proto__.__proto__)
    console.log(Function.__proto__.prototype)
    console.log( 'kkL:',Object.prototype.__proto__)

    const m =Object()
    console.log(Function.prototype.constructor());
    console.log(Object.prototype.constructor());
   console.log(typeof Function)
   console.log(typeof Object)
   console.log(typeof Array)

   var name='尹鹏孝';
    var time = null;
   var myObject={
    name:'尹鹏孝11',
    getName:function(){

           if(!time){
            for (var i = 0; i <= 10; i++) {
                   (function (i) {

                      time =  setTimeout(() => {
                           console.log(i);

                       }, 1000 * i);
                       console.log(i);

                   })(i);
               }
           }else{

                console.log(time)
                // myObject.getName()

           }

    }
   }
//    console.log(myObject.getName())

let arrs=new Array(6).fill(function(){},0,6);
console.log(arrs);

// 手写new

createNew(fn,...ars){
    if( typeof fn!=='function'){
        throw Error('fn 不是函数');
    }
    if('create' in Object ){
        var obj = Object.create(fn.prototype);
        var res = fn.apply(obj, ars);
        return res instanceof Object ? res : obj;
    }else{
        var fn2 = function(fn){
          return {};
        }

        fn2.prototype = {
            constructor: fn.prototype
        };
        var obj =  new fn2();
        var res = fn.apply(obj, ars);
        return res instanceof Object ? res : obj;
    }

}

    //object创建
    var Person = new Object();
    Person.name='rose';
    Person.age=18;
    Person.sayName = function(){
        console.log(this.name);
    }
    console.log(Person)
    //字面量
    var Person = {
        name:'rose',
        age:18,
        syaName:function(){
            console.log(this.name)
        }
    }
    //工厂模式
    function createPerson(name,age,actor){
        person = new Object();
        person.name= 'rose';
        person.age=18;
        person.sayName = function(){
            console.log(this.name)
        }
        return person;
    }
    //构造函数
    function Person(name,age,job){
        this.name=name;
        this.age=age;
        this.job=job;
        this.sayName=function(){
            console.log(this.name);
        }
    }
    //原型模式
    function Person(name,obj,job){
        //this.name = name;
    }
    Person.prototype.age=1;
    Person.prototype.job='web前端'
    Person.prototype.sayName=function(name){
        console.log(name )
        this.name=name;
    }

     //原型与构造函数模式
        function Person(name, obj, job) {
            this.name = name;
        }
        Person.prototype.age = 1;
        Person.prototype.job = 'web前端'
        Person.prototype.sayName = function (name) {
            console.log(name)
            this.name = name;
        }

    </script>
</body>
</html>